home *** CD-ROM | disk | FTP | other *** search
- #include "voronoi.h"
-
- int ntry, totalsearch;
-
- void ELinitialize()
- {
- int i;
-
- freeinit(&hfl, sizeof **ELhash);
- ELhashsize = 2 * sqrt_nsites;
- ELhash = (struct Halfedge **) myalloc ( sizeof (*ELhash) * ELhashsize);
- for(i=0; i<ELhashsize; i +=1)
- ELhash[i] = (struct Halfedge *)NULL;
- ELleftend = HEcreate( (struct Edge *)NULL, 0);
- ELrightend = HEcreate( (struct Edge *)NULL, 0);
- ELleftend->ELleft = (struct Halfedge *)NULL;
- ELleftend->ELright = ELrightend;
- ELrightend->ELleft = ELleftend;
- ELrightend->ELright = (struct Halfedge *)NULL;
- ELhash[0] = ELleftend;
- ELhash[ELhashsize-1] = ELrightend;
- }
-
- struct Halfedge *HEcreate(e, pm)
- struct Edge *e;
- int pm;
- {
- struct Halfedge *answer;
-
- answer = (struct Halfedge *) getfree(&hfl);
- answer->ELedge = e;
- answer->ELpm = pm;
- answer->PQnext = (struct Halfedge *) NULL;
- answer->vertex = (struct Site *) NULL;
- answer->ELrefcnt = 0;
- return(answer);
- }
-
- ELinsert(lb, new)
- struct Halfedge *lb, *new;
- {
- new->ELleft = lb;
- new->ELright = lb->ELright;
- (lb->ELright)->ELleft = new;
- lb->ELright = new;
- }
-
- /* Get entry from hash table, pruning any deleted nodes */
- struct Halfedge *ELgethash(b)
- int b;
- {
- struct Halfedge *he;
-
- if(b<0 || b>=ELhashsize)
- return((struct Halfedge *) NULL);
- he = ELhash[b];
- if (he == (struct Halfedge *)NULL || he->ELedge!=(struct Edge *)DELETED)
- return (he);
-
- /* Hash table points to deleted half edge. Patch as necessary. */
- ELhash[b] = (struct Halfedge *) NULL;
- if ((he->ELrefcnt -= 1) == 0) makefree(he, &hfl);
- return ((struct Halfedge *) NULL);
- }
-
- struct Halfedge *ELleftbnd(p)
- struct Point *p;
- {
- int i, bucket;
- struct Halfedge *he;
-
- /* Use hash table to get close to desired halfedge */
- bucket = (p->x - xmin)/deltax * ELhashsize;
- if(bucket<0)
- bucket =0;
- if(bucket>=ELhashsize)
- bucket = ELhashsize - 1;
- he = ELgethash(bucket);
- if(he == (struct Halfedge *) NULL) {
- for(i=1; 1 ; i += 1) {
- if ((he=ELgethash(bucket-i)) != (struct Halfedge *) NULL)
- break;
- if ((he=ELgethash(bucket+i)) != (struct Halfedge *) NULL)
- break;
- }
- totalsearch += i;
- }
- ntry += 1;
-
- /* Now search linear list of halfedges for the corect one */
- if (he==ELleftend || (he != ELrightend && right_of(he,p))) {
- do {
- he = he->ELright;
- } while (he!=ELrightend && right_of(he,p));
- he = he->ELleft;
- } else
- do {
- he = he->ELleft;
- } while (he!=ELleftend && !right_of(he,p));
-
- /* Update hash table and reference counts */
- if(bucket > 0 && bucket <ELhashsize-1) {
- if(ELhash[bucket] != (struct Halfedge *) NULL)
- ELhash[bucket]->ELrefcnt -= 1;
- ELhash[bucket] = he;
- ELhash[bucket]->ELrefcnt += 1;
- }
- return (he);
- }
-
- /*
- * This delete routine can't reclaim node, since pointers from hash
- * table may be present.
- */
- ELdelete(he)
- struct Halfedge *he;
- {
- (he->ELleft)->ELright = he->ELright;
- (he->ELright)->ELleft = he->ELleft;
- he->ELedge = (struct Edge *)DELETED;
- }
-
- struct Halfedge *ELright(he)
- struct Halfedge *he;
- {
- return (he->ELright);
- }
-
- struct Halfedge *ELleft(he)
- struct Halfedge *he;
- {
- return (he->ELleft);
- }
-
- struct Site *leftreg(he)
- struct Halfedge *he;
- {
- if(he->ELedge == (struct Edge *)NULL)
- return(bottomsite);
- return( he->ELpm == le ? he->ELedge->reg[le] : he->ELedge->reg[re]);
- }
-
- struct Site *rightreg(he)
- struct Halfedge *he;
- {
- if(he->ELedge == (struct Edge *)NULL)
- return(bottomsite);
- return( he->ELpm == le ? he->ELedge->reg[re] : he->ELedge->reg[le]);
- }
-